/*
 *  @(#)PageBean.java    0.3 16/04/2009
 */
package org.miao.example.repository;

import java.util.List;

/**
 * 分页组件
 * @author Miao
 * @version 0.3
 * @since 0.3
 */
public class PageBean<T> {

    /**
     * 缺省单页记录数量
     */
    public static final int DEFAULT_PAGESIZE = 10;
    /**
     * 缺省当前页
     */
    public static final int DEFAULT_CURRENTPAGE = 1;
    /**
     * 单页记录数量
     */
    private int pageSize = DEFAULT_PAGESIZE;
    /**
     * 当前页
     */
    private int currentPage = DEFAULT_CURRENTPAGE;
    /**
     * 总记录数
     */
    private long totalResult = 0;
    /**
     * 结果列表
     */
    private List<T> resultList;

    /**
     * 缺省构造方法
     * @since 0.3
     */
    public PageBean() {
        resultList = null;
    }

    /**
     * 带参数构造方法
     * @param currentPage 当前页
     * @param pageSize 单页记录数量
     * @param totalResult 总记录数
     * @param resultList 结果列表
     * @since 0.3
     */
    public PageBean(int currentPage, int pageSize, long totalResult, List<T> resultList) {
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.totalResult = totalResult;
        this.resultList = resultList;
    }

    /**
     * 获得总页数
     * @return 总页数
     * @since 0.3
     */
    public long getPageCount() {
        long count = getTotalResult() / getPageSize();
        if (getTotalResult() % getPageSize() > 0) {
            count++;
        }
        return count;
    }

    /**
     * 是否还有下一页
     * @return 是否还有下一页
     * @since 0.3
     */
    public boolean isHasNextPage() {
        return (getCurrentPage() + 1 <= getPageCount());
    }

    /**
     * 获得下页的页号
     * @return 下页的页号
     * @since 0.3
     */
    public int getNextPage() {
        if (isHasNextPage()) {
            return getCurrentPage() + 1;
        } else {
            return getCurrentPage();
        }
    }

    /**
     * 是否有上一页
     * @return 是否有上一页
     * @since 0.3
     */
    public boolean isHasPrePage() {
        return (getCurrentPage() - 1 >= 1);
    }

    /**
     * 返回上页的页号
     * @return 上页的页号
     * @since 0.3
     */
    public int getPrePage() {
        if (isHasPrePage()) {
            return getCurrentPage() - 1;
        } else {
            return getCurrentPage();
        }
    }

    /**
     * 计算起始记录
     * @param currentPage 当前页
     * @param pageSize 单页记录数量
     * @return 起始记录号
     * @since 0.3
     */
    public static int getFirstResult(int currentPage, int pageSize) {
        if (currentPage < 0 || pageSize < 0) {
            return -1;
        } else {
            return ((currentPage - 1) * pageSize);
        }
    }

    /**
     * 获得单页记录数量
     * @return 单页记录数量
     * @since 0.3
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * 设置单页记录数量
     * @param pageSize 单页记录数量
     * @since 0.3
     */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 获得当前页
     * @return 当前页
     * @since 0.3
     */
    public int getCurrentPage() {
        return currentPage;
    }

    /**
     * 设置当前页
     * @param currentPage 当前页
     * @since 0.1
     */
    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    /**
     * 获得总记录数
     * @return 总记录数
     * @since 0.1
     */
    public long getTotalResult() {
        return totalResult;
    }

    /**
     * 设置总记录数
     * @param totalResult 总记录数
     * @since 0.3
     */
    public void setTotalResult(long totalResult) {
        this.totalResult = totalResult;
    }

    /**
     * 获得结果列表
     * @return 结果列表
     * @since 0.3
     */
    public List<T> getResultList() {
        return resultList;
    }

    /**
     * 设置结果列表
     * @param resultList 结果列表
     * @since 0.3
     */
    public void setResultList(List<T> resultList) {
        this.resultList = resultList;
    }
}
